package main

import (
	"fmt"
	"sync"
)

func addNum2(count *int, wg *sync.WaitGroup, lock *sync.Mutex) {
	defer wg.Done()
	for i := 0; i < 10000; i++ {
		lock.Lock()
		*count++
		lock.Unlock()
	}
}

// 每次运行结果都是30000,
// 注意:
// 1、同一协程里，不要在尚未解锁时再次使加锁
// 2、同一协程里，不要对已解锁的锁再次解锁
// 3、加了锁后，别忘了解锁，必要时使用 defer 语句
func main() {
	var count int = 0
	var wg sync.WaitGroup
	// 互斥锁
	var lock sync.Mutex
	// lock = sync.Mutex{}
	wg.Add(3)
	go addNum2(&count, &wg, &lock)
	go addNum2(&count, &wg, &lock)
	go addNum2(&count, &wg, &lock)

	wg.Wait()

	fmt.Println(count)

}
